package com.huanyang.idempotent.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
public class TokenUtilService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 存入 Redis 的 Token 键的前缀
     */
    private static final String IDEMPOTENT_TOKEN_PREFIX = "idempotent_token:";

    public String generateToken(String value) {
        String token = UUID.randomUUID().toString().replace("-", "");
        // 设置存入 Redis 的 Key
        String key = IDEMPOTENT_TOKEN_PREFIX + value;
        // 存储 Token 到 Redis，且设置过期时间为10分钟
        redisTemplate.opsForValue().set(key, token, 10, TimeUnit.MINUTES);
        return token;
    }

    /**
     * 验证 Token 正确性
     *
     * @param token token 字符串
     * @param value value 存储在Redis中的辅助验证信息
     * @return 验证结果
     */
    public void validToken(String token, String value) {
        String key = IDEMPOTENT_TOKEN_PREFIX + value;
        // 从 Redis 中取出 Token
        String redisToken = redisTemplate.opsForValue().get(key);
        if (redisToken != null && redisToken.equals(token)) {
            log.info("首次调用接口");
            // 删除 Redis 中的 Token
            redisTemplate.delete(key);
        }
        else {
            log.info("重复调用接口");
        }
    }
}
